Поставил расстояние 256 там, где вычисляются полярные координаты - всё заработало. То есть слишком маленькие значения нельзя, как 64, всё ясно. Тема закрыта.
Вот как должен выглядеть полностью правильный триггер без утечек, единственная утечка создастся только при первом использовании, это я так понял переменная группы, ее обнулять нельзя, иначе скил будет работать только раз.
PhysCraft, он уже пробовал этот метод. Не подошёл из-за белых портретов. Steal nerves, извини, обманул тебя. Чтобы сделать вынесение в отдельную поверхность, надо сначала удвоить вершины. Но только почему-то нормально не работает, часть вершин не удваивается.
Сейчас посмотрю, как с анимацией текстур работал.
А ведь ты не сделал копию анимаций, просто продублировал имеющиеся, дав им название с тэгом. Это не даст желаемого.
Извини, но пока путного не получается. Может быть опосля придёт умная мысля.
По идее всё равно надо делать реальную копию анимационного ряда, а не просто дать новое название тем же кадрам. Может быть ты в процессе копирования кадров согласишься, что легче создать кучу крестьянок с новыми моделями в РО и триггерно их заменять, чем одну почти такую же тяжёлую за счёт анимаций модель с тэгами. При этом не факт, что у неё с портретом будет порядок.
Заходить в карту чтобы скоротать время, пока друзья ещё не пришли/ ещё играют (в ту катку, с которой ты вылетел/крашнулся)
Цель от данной игры:
(большинство рпг)
*1) Попытаться выбить что-то, что падает с одноразового босса, и свалить на рмк
*2) Помочь другу попытаться выбить что-то, что падает с в пункте 1
(большинство других карт)//(Те же тролли и эльфы) [Больше психология и нежелание играть в неравных условиях]
*1) Этот эльф абузит что-либо!
*2) Эти эльфы собрались в войсе и абузят одну стенку на четверых! Делал так вчера :D
*3) Этот тролль играет с мх и всегда сразу находит любого эльфа на большой карте!
Попытка поиграть во что-то, оборачивается чем-то плохим:
*1) Выбивается инэт/свет/ потолок падает на игрока
*2) Вырубается что-то из оборудования, в следствии чего пк зависает/уходит в ребут
*3) Крашит/Десинкает из вара
*4) Винда что-то непонятное выводит (Та же нехватка озу/бэды на харде)
Определённый сегмент игроков, зовущийся троллями которые что и делают что по кд оскорбляют других, и подпалив игроков просто ливают.
Отдельно насчёт игроков: цифры = пункты выше из шапки
Пункты 1, 2, 5, 6, 7, 8, 9, 10, 12 относятся больше к тому, что игроки с "ини" показывают друг другу зубы и соблюдают этот стиль общения на протяжении всей катки
Пункты 8,12 относятся к тем, с чем можно смириться и продолжить играть в мапу
Пункт 6 - для "Соло" карт, которые просто нельзя пройти в одного, не имея друзей ,что мной расценивается как просто потеря времени
Идеальной карты нет и небудет - вы не сможете совместить абсолютно все жанры, которые нравятся комьюнити - Одновременно ТД и РПГ я ещё не видел, не зря это разные жанры. Если она и будет, то все наткнутся на лимит в 12 слотов, с которых гарена наврядли когда выйдет.
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
вариант №1 - не нулить переменные, оставляя утечки номеров хендлов. это безопасно, да, если знаешь, что делаешь.
№2 - ловить UNIT_DEATH и чистить за ним
orc01, есть событие EventUnitsInRange, делаешь триггер, а при постройки башни добавляешь в него это событие для каждой башни, в условиях проверяешь что тот кто подошел нужного тебе типа юнит, ну действия думаю проблем не вызовут...
1)Нужно ли при создании на джассе в конце обнулять/удалять что-то как при создании на ГУИ типо set u = null и т.д.?
Да нужно, но далеко не все. Чекни статьи, там про это расписано подробно.
2)Как видно на скрине юниту даются способности на 10 сек, можно ли в одной строчке это как то написать, а не писать каждый скилл в новой строке? Попытался сделать через , выдало ошибку.
Нет, только по одному. И TriggerSleepAction я бы использовать не стал, вместо них я бы заюзал таймеры.
3)Слышал про при конвертации в текст остаются пару лишних строк в триггере, абсолютно ненужные я удалил(Которые были при создании на ГУИ, скрин 2), нужно ли еще что-то удалять?
S2I принимает строку в качестве параметра и никак её не изменяет
с чего вдруг он должен создавать новые строки?
I2S создаёт временную строку
если в таблице есть строка равная временной по хэшу то он возвращает строку из таблицы
если в таблице строки нету то он добавляет нашу временную строку в таблицу
т.е. обычный алгоритм хэширования
name_to_trigger(string name) {
for (integer index = 0; index < name_array_index; index++) {
if name_array[index] == name {
return trigger_array[index];
}
}
}
Затем регистрируем все триггеры через register_trigger.
А после этого думаем, реально ли у нас столько абилок, что простая последовательность if name == "my_ability" then RunTrigger(my_ability) хуже этого решения
А касательно остальной части, если UnitUserData нигде не используется, создаешь массив юнитов и отрядов. Массив юнитов забиваешь своими капитанами. В UnitUserData капитана пихаешь его порядковый номер в массиве. Создаешь группу юнитов для этого капитана.
Добавление через каст способности.
Я бы делал через 2 разные абилки с одной и той же позицией в интерфейсе. Пока нужный тебе юнит не является частью отряда - у него таргетная абилка при касте которой на капитана он добавляется в группу соответствующего капитана и получает 2ю абилку взамен первой.
Касательно выделения этих пехотинцев - можно намутить что-то с передачей контроля или создать триггер, который будет снимать выделение с юнитов у которых есть 2я абилка. Если ты хочешь чтобы по одиночке можно было выделять пехотинцев - можешь создать переменную для каждого игрока с капитанами, куда будет просто записываться последний выбранный юнит. При снятии выделения - проверять не выбран ли этот же юнит, в случае чего не снимать выделение. Правда не уверен будет ли корректно работать :> В крайнем случае - будет работать в три клика вместо двух. Если я не ошибаюсь.
Касательно поведения этих пехотинцев - что-то реально стоящее сделать сложно. Возможно, но мне не с руки все расписывать :> Простейший вариант - приказывать пехотинцам после добавления в группу следовать за капитаном.
Добавление через атаку капитана
Триггер, проверяющий что капитан получил урон или атакован, как угодно. Далее любым способом проверяешь есть ли в группе этого капитана юниты. Если нет - выбираешь всех пехотинцев N радиусе, добавляешь в отряд, заменяешь абилку/либо просто приказываешь кастануть в капитана первую абилку.
native UnitHasItem takes unit whichUnit, item whichItem returns boolean
function UnitHasItemOfTypeBJ takes unit whichUnit, integer itemId returns boolean
return GetInventoryIndexOfItemTypeBJ(whichUnit, itemId) > 0
endfunction
// Данная функция утечна, так как indexItem не обнуляется
function GetInventoryIndexOfItemTypeBJ takes unit whichUnit, integer itemId returns integer
local integer index
local item indexItem
set index = 0
loop
set indexItem = UnitItemInSlot(whichUnit, index)
if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
return index + 1
endif
set index = index + 1
exitwhen index >= bj_MAX_INVENTORY
endloop
return 0
endfunction
function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean
local integer index = 0
loop
if GetItemTypeId(UnitItemInSlot(whichUnit, index)) == itemId then
return true
endif
set index = index + 1
exitwhen index == bj_MAX_INVENTORY
endloop
return false
endfunction
// Можно ещё так написать
function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean
local integer index = 0
loop
exitwhen GetItemTypeId(UnitItemInSlot(whichUnit, index)) == itemId
set index = index + 1
exitwhen index == bj_MAX_INVENTORY
endloop
return index < bj_MAX_INVENTORY
endfunction
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
Просто предметы перестают быть триггерно скрытыми после загрузки сохранения. Надо делать либо по твоему варианту, то есть создавать предмет, либо по варианту ssbbssc, то есть куда-то переносить предметы при инициализации карты, а в нужный момент возвращать на старые позиции.
Ещё при загрузке слетает цвет воды и освещение, если они нестандартные. Нужно задавать их в триггере с событием Игра загружена.
Если цвет воде можно задать в GUI, то для освещения потребуется Custom Script. Вот тут мне помогли нестандартное освещение опять задать:
Ещё сложность в дополнительных кампаниях сбрасывается после каждой главы, но вроде бы ты не пользуешься уровнями сложности. Сбрасывается, когда нажимаешь Продолжить, а если выходишь на экран кампании с кнопками глав, то всё нормально.
По идее с событием Игра загружена можно и с предметами аналогично поступать, скрывая их, если они ещё не активированы. Но потребуется вводить ещё переменные, которые будут указывать видимость или невидимость у предмета.
В хеш-таблице изначально возвращает null (это если ничего не записано). Помню делал похожую систему только с итемами, при проверке через Load... проверял не пуста ли ячейка (!=null). По какой-то причине, уже не помню, не всегда так работает, неизвестно от чего система не работает, щас лень браться и искать ошибку.
В вашем понимании null на jass:
null = Нет боевая единица.
Ответ: чтобы записать null, ничего не надо записывать. Чтобы записать ноль у целого (0) или вещественного (0.00) числа, тоже ничего не надо перезаписывать. Если ничего не записано, вернет null или ноль. Пользуемся дебагами и проверяем.
Еще не попутал ли ты ключи местами? Там на гуи 1, 2 на jass перевернуть надо типа 2, 1. Смотрим
смотрим
есть BJ тоже гуи-команды. конвентируем в код и видим есть SaveUnitHandleBJ и SaveUnitHandle. Нужно представить ключи в таком порядке в каком изложены в нативке SaveUnitHandle а не в SaveUnitHandleBJ (ибо потом вас гуи путает): parentKey - родительский ключ childKey - младший ключ
представить хэш-таблицу можно как таблицу Excel, parentKey как строку, а childKey как столбик. И по этим вы находите ячейку. Еще в плюсе хэндлы юзать, по хэндлам будете строки находить. Стираете инфу тоже по хэндлу, по родительскому ключу. А если нужно стереть строку используйте FlushChildHashtable
Просто предметы перестают быть триггерно скрытыми после загрузки сохранения. Надо делать либо по твоему варианту, то есть создавать предмет, либо по варианту ssbbssc, то есть куда-то переносить предметы при инициализации карты, а в нужный момент возвращать на старые позиции.
Ещё при загрузке слетает цвет воды и освещение, если они нестандартные. Нужно задавать их в триггере с событием Игра загружена.
Если цвет воде можно задать в GUI, то для освещения потребуется Custom Script. Вот тут мне помогли нестандартное освещение опять задать:
Ещё сложность в дополнительных кампаниях сбрасывается после каждой главы, но вроде бы ты не пользуешься уровнями сложности. Сбрасывается, когда нажимаешь Продолжить, а если выходишь на экран кампании с кнопками глав, то всё нормально.
По идее с событием Игра загружена можно и с предметами аналогично поступать, скрывая их, если они ещё не активированы. Но потребуется вводить ещё переменные, которые будут указывать видимость или невидимость у предмета.
Таких багов много, почему то оптимизатор берет данные из слк таблиц игры на часть объектов, пробуй wc3ultimate opt, на хайве выложена... Мб кто уже и новый виджитайзер запилил.
стремиться создавать объекты не на карте, а в триггерах, сохраняя ссылки на нужные из них;
там, где в гуи открываются окна со списком из РО, использовать джасс и вводить равкод, а там, где список расставленных на карте юнитов, использовать переменные;
в РО с полями, где указаны объекты, работать через Shift+Enter и вводить равкод, чтобы не открывать список.
В общем покопался,
Цвета находятся в \ReplaceableTextures\TeamColor\
Внутри 16 текстур TeamColorXX.blp (где ХХ от 00 до 15) которые имеют свои цвета. (размер 8х8)
Внутри карты их заменить нельзя (приоритет на чтении из war3.mpq)
Так же там есть героическое свечение, находится в \ReplaceableTextures\TeamGlow\
Очень жаль что нельзя сменить цвет средствами карты. Это бы открыло большие возможности. (например сделать 15 разных покрасок одной и той же модели)
Сделать свою способность на основе Канала, настроить применение на точку. При событии каста создавать юнитов в точке каста. Все необходимое есть в статьях ( тут и тут).
Сделай спел на основе канала, при применении создаёшь руну с дождём и даёшь герою, ИЛИ создаёшь даммика и приказываешь ему кастовать дождь, но с руной всё же лучше.
Дальше пришла в голову другая идея. Думаю, можно сделать с помощью ремонта зданий Альянса: на месте смерти героя создаётся здание с моделью креста со здоровьем 1/100 ед., а союзные герои ремонтируя крест будут повышать её здоровье, получается некая иллюзия прогресс бара. И если спрятать способность ремонта с помощью функции HideAbilityButton( ) из мемхака, то будет ли она срабатывать при нажатии на ПКМ? Также, как отловить момент полного ремонта здания? С помощью таймера проверять процент здоровья каждые доли секунды?
раскрыть
scope HeroRevive initializer Initialization
struct herorevive
private unit dyingUnit
private unit reincarnate
private real life
private thistype prev
private thistype next
public static constant trigger trig = CreateTrigger( )
public static constant timer period = CreateTimer( )
private static method iterate takes nothing returns nothing
local thistype this = thistype( 0 ).next
loop
exitwhen ( this == 0 )
if ( GetWidgetLife( this.reincarnate ) > this.life ) then
set this.life = GetWidgetLife( this.reincarnate )
elseif ( GetWidgetLife( this.reincarnate ) >= GetUnitState( this.reincarnate, UNIT_STATE_MAX_LIFE ) ) then
call ReviveHero( this.dyingUnit, GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), true )
call RemoveUnit( this.reincarnate )
set this.reincarnate = null
set this.life = 0.0
set this.prev.next = this.next
set this.next.prev = this.prev
if ( thistype( 0 ).next == 0 ) then
call PauseTimer( thistype.period )
endif
call thistype.deallocate( this )
elseif ( GetWidgetLife( this.reincarnate ) <= this.life ) then
set this.life = 1.0
call SetWidgetLife( this.reincarnate, this.life )
endif
set this = this.next
endloop
endmethod
public static method actions takes nothing returns nothing
local thistype this = thistype.allocate( )
set this.next = 0
set this.prev = thistype( 0 ).prev
set this.next.prev = this
set this.prev.next = this
set this.dyingUnit = GetDyingUnit( )
set this.reincarnate = CreateUnit( GetOwningPlayer( this.dyingUnit ), 'h003', GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), 0.0 )
set this.life = 1.0
call SetUnitPathing( this.reincarnate, false )
call SetWidgetLife( this.reincarnate, this.life )
if ( this.prev == 0 ) then
call TimerStart( thistype.period, 0.10, true, function thistype.iterate )
endif
endmethod
public static constant method conditions takes nothing returns boolean
return IsUnitType( GetDyingUnit( ), UNIT_TYPE_HERO )
endmethod
endstruct
public function Initialization takes nothing returns nothing
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerAddCondition( herorevive.trig, Condition( function herorevive.conditions ) )
call TriggerAddAction( herorevive.trig, function herorevive.actions )
endfunction
endscope
Вот только если спрятать кнопку через HideAbilityButton( ), то способность ремонта зданий исчезает и не работает через ПКМ.
Советую проверять бекапы один за другим, и в том, в котором впервые возникает такая проблема, и искать ошибку, она наверняка где-то в изменениях относительно хронологически предыдущей версии.
Ну вопервых не сделаешь, клоны ожившего огня не настраивается,это багнутая абилка. Можно редактировать только оригинал. Во вторых орбы не стак, так что делай кастом оживший огонь.
Работает только оригинал , точнее с него настройки на все остальные идут клоны спелла, настройки смотри в опен доте, так то она работ, но вот орб и ннсовместтмость с другими пассивками, это не очень.
Эх, друг) ну я реализовал так. Есть в способностях замечательный закл перевоплащение иллидана. В нейтрально - враждебных. То есть ты создаешь двух героев у одного рэнжа 600 у другова 100 например, а этот спел меняет твоих героев местами(каждому там уже свои спец эффекты делаешь). Там есть еще у меха спел есть похожий, там без ограничения по времени, ну думаю идею ты понял.
Второй комп сломан поэтому проверить не могу, почему у меня подозрение, что оно должно работать.... Хотя могу и ошибаться, нормально делал карты года 2 назад.
» WarCraft 3 / AdicHelper?
» WarCraft 3 / Хеш-таблица и юнит
» WarCraft 3 / Конвертация в строку
» WarCraft 3 / Спелла нет
» WarCraft 3 / Проблемы с триггером в карте(1.26)
» WarCraft 3 / Процентный хил
» WarCraft 3 / Хеш-таблица
» WarCraft 3 / Баг с триггерами зависает wc3 и ломается поведение юнитов
» WarCraft 3 / Баг в карте юниты перестали ходить
» WarCraft 3 / Проблема с выбором цели в триггерах
» WarCraft 3 / Тим колор
» WarCraft 3 / Как изменить применение способности.
» WarCraft 3 / Восстановление здоровья
» WarCraft 3 / Пересадка отдельных анимации
» WarCraft 3 / Способность с процентом здоровья
» WarCraft 3 / Повторение триггера
» WarCraft 3 / Мгновенный поворот юнита
» WarCraft 3 / Баги со способностью оживший огонь в кампании
» WarCraft 3 / Приказ каждому юниту в регионе
» WarCraft 3 / Проблема с иконками
» WarCraft 3 / Смена типа атаки
» WarCraft 3 / Одновременно используются 3 способности на основе одной
» WarCraft 3 / Ошибка в тригере выбора расы
» WarCraft 3 / Почему мобы не идут?
» StarCraft 2 / Hots и LOTV